package com.qwt.part_time_api.utils;

import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author 君子慎独
 * Token工具类
 */
@Slf4j
public class JwtUtil {

    public static final long TTL = 2 * 60 * 60 * 1000;
    private static final String SECRET_KEY = "qwt_2022_!@$%&*";
    private static final String AUTHORITIES = "authorities";

    /**
     * 生成 token
     */
    public static String generateToken(String username) {
        log.info("生成TOKEN");
        return generateToken(username, new ArrayList<>());
    }

    /**
     * 生成 token
     */
    public static String generateToken(String username, List<String> authorities) {
        log.info("生成TOKEN");
        return Jwts.builder()
                .setSubject(username) // 主题
                .claim(AUTHORITIES, authorities)
                .setIssuedAt(new Date()) // 发布时间
                .setExpiration(new Date(System.currentTimeMillis() + TTL)) // 到期时间
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 签名
                .compact();
    }

    /**
     * 生成 token
     */
    private static String generateToken(Claims claims) {
        log.info("生成TOKEN");
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + TTL)) // 到期时间
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 签名
                .compact();
    }

    /**
     * 解析 token
     */
    public static Claims parseToken(String token) {
        log.info("解析TOKEN");
        Claims claims;
        try {
            claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
        } catch (ExpiredJwtException e) {
            log.info("TOKEN过期");
            claims = e.getClaims();
        } catch (UnsupportedJwtException | IllegalArgumentException | SignatureException | MalformedJwtException e) {
            log.info("TOKEN不合法");
            claims = null;
        }
        return claims;
    }

    /**
     * 获取 username
     */
    public static String getUsername(String token) {
        log.info("从TOKEN中获取username");
        return parseToken(token).getSubject();
    }

    /**
     * 获取 username
     */
    public static String getUsername(Claims claims) {
        log.info("从claims中获取username");
        return claims.getSubject();
    }

    /**
     * 是否过期
     */
    public static boolean isExpiration(String token) {
        log.info("判断TOKEN是否过期");
        return parseToken(token).getExpiration().before(new Date());
    }

    /**
     * 是否过期
     */
    public static boolean isExpiration(Claims claims) {
        log.info("判断claims是否过期");
        return claims.getExpiration().before(new Date());
    }

    /**
     * 获取角色
     */
    public static List<String> getAuthorities(String token) {
        return parseToken(token).get(AUTHORITIES, List.class);
    }

    /**
     * 获取角色
     */
    public static List<String> getAuthorities(Claims claims) {
        return claims.get(AUTHORITIES, List.class);
    }

    /**
     * 刷新 token
     */
    public static String refreshToken(String token) {
        log.info("刷新TOKEN");
        return generateToken(parseToken(token));
    }

    /**
     * 请求头
     */
    public static String getHeader() {
        log.info("获取响应头");
        return "Authorization";
    }
}
